import java.util.Scanner;
/*
动态规划
范围上尝试的模型
给定一个整型数组arr，代表数值不同的纸牌排成一条线玩家A和玩家B依次拿走每张纸牌规定玩家A先拿，
玩家B后拿但是每个玩家每次只能拿走最左或最右的纸牌玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数
 */

public class Demo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
        int ret = win(arr);
        System.out.println(ret);
    }

    public static int win(int[] arr)
    {
        int N = arr.length;
        int[][] f = new int[N][N];
        int[][] s = new int[N][N];
        for (int i = 0; i < N; i++)
        {
            f[i][i] = arr[i];
        }

        for (int i = 1; i < N; i++)
        {
            int L = 0;
            int R = i;

            while (L < N && R < N)
            {
                f[L][R] = Math.max(arr[L] + s[L + 1][R], arr[R] + s[L][R - 1]);

                s[L][R] = Math.min(f[L + 1][R], f[L][R - 1]);
                L++;
                R++;
            }


        }
        return Math.max(f[0][N - 1], s[0][N - 1]);
    }

}
   /* private static int f(int[] arr, int L, int R) {
        if(L==R)
        {
            return arr[L];
        }
        return Math.max(arr[L]+s(arr,L+1,R),arr[R]+s(arr,L,R-1) );
    }

    private static int s(int[] arr, int L, int R) {
        if(L==R)
        {
            return 0;
        }
        return Math.min(f(arr,L+1,R),f(arr,L,R-1) );
    }
}*/
